package com.lagou.rpc.consumer;

import com.lagou.rpc.api.IUserService;
import com.lagou.rpc.consumer.serverinfo.ServerInfo;
import com.lagou.rpc.pojo.User;
import com.lagou.zkutils.GetCuratorClient;
import org.apache.curator.framework.CuratorFramework;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Map;

public class SimpleTask implements Runnable {

    /** 思路：
     *  1.获取所有服务器列表，并按照响应时间 usedTime 排序，
     *  2.选择响应时间最小的服务器交互，也就是排序中第一个服务器
     *  3.把执行请求开始前后时间更新至ServerInfo
     *  4.更新在zookeeper节点上的最后一次请求时间和响应时间(刚开始在创建节点的时候就已经初始化值，系统时间:0)
     */

    private CuratorFramework zkClient;

    public SimpleTask(CuratorFramework zkClient) {
        this.zkClient = zkClient;
    }

    @Override
    public void run() {
        while (true){
            if (ClientBootStrap.serverMap.isEmpty()){
                // 如果没有服务提供者(服务端)，继续 下一次循环
                continue;
            }

            // 1.获取到服务提供者列表
            ArrayList<Map.Entry<String, ServerInfo>> entries = new ArrayList<>(ClientBootStrap.serverMap.entrySet());
            // 排序 服务器列表，根据响应时间
            entries.sort((o1, o2) -> (int) (o1.getValue().getUsedTime() - o2.getValue().getUsedTime()));

            System.out.println("--------排序完毕-------");
            for (Map.Entry<String, ServerInfo> entry : entries) {
                // 一个 entry 就代表一个服务端节点
                System.out.println(entry.getKey()+":"+entry.getValue());
            }
            // 2.选择响应时间最小的服务器交互，也就是排序中第一个服务器
            ServerInfo serverInfo = entries.get(0).getValue();
            System.out.println("使用的服务端："+entries.get(0).getKey());
            IUserService iUserService = serverInfo.getiUserService();
            // 当前系统时间
            long startTime = System.currentTimeMillis();
            //  执行请求
            User user = iUserService.getById(1);
            System.out.println("user==="+user);
            // 执行请求结束的系统时间
            long endTime = System.currentTimeMillis();
            // 响应时间
            long usedTime = endTime - startTime;
            serverInfo.setLastTime(endTime);
            serverInfo.setUsedTime(usedTime);

            // 更新在zookeeper节点上的最后一次请求时间和响应时间(刚开始在服务端创建节点的时候就已经初始化节点上的值，系统时间:0)
            try {
                zkClient.setData().forPath(GetCuratorClient.path+"/"+entries.get(0).getKey(),
                        (endTime+":"+usedTime).getBytes(StandardCharsets.UTF_8));
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
}
